Author Id: 17082 Author Name: Sonicarvalho Post Content: Hola a todos! No podía dejar de reparar en la sección de Investigación, pues yo soy un maníaco de ASM '¬¬ En primer lugar, vamos a iluminar todos los bytes (o cuasi todos). [IMG]http://img148.imageshack.us/img148/3869/partypokemontable.png[/IMG] Ahora vamos a las explicaciones. (Nota que voy hablar a mi manera, entonces Encriptar= Cifrar y Desencriptar = descifrar) Los datos de los pokemon en la generación 3 son compuestos por 80 bytes, pero tienen 100 bytes (0x64) cuando están en la party, como podéis observar en esa tabla. Pero como los 20 bytes extras son de cosas como HP, Status, etc. , no son importantes lo suficiente para ser mencionados, pues están desencriptados e pueden ser fácilmente accedidos y cambiados con WTBO. El resumen: Los datos que nos interesan son los verdes e los azules, porque los rojos no son guardados cuando el pokemon es depositado en el PC (porque pensaban que los pokemons eran curados e su HP era otra vez el máximo? Porque eses datos desaparecen e cuando van para la party son copias de los datos originales de los pokemons (los 80 bytes)). En esos 80 bytes, podemos dividi-los en dos partes: [list=1] [*]Los primeros 32 bytes son informaciónes desencriptadas, como lo nombre, lo nombre de su original trainer y una cosa mucho importante llamada personalidad [4 bytes], que contiene la información como ser shiny , la naturaleza, e mucho mas, necesaria para desencriptar los otros 48 bytes! [*]Los otros 48 bytes son informaciones encriptadas que contienen las informaciónes mas importantes de nuestros pokemons, como el espécimen, la EXP, los IV's & EV's, lo nivel, etc. [/list] Dado eso, podemos decir que los datos que interesan a nosotros so los azules. Pero, sólo se puede acceder a esos datos si tenemos la clave (o es llave? Soy portugués, me perdonen xD ). Ahora enfrentamos otro problema: la clave no es la misma para todos los pokemons, de facto es única! PERO lo algoritmo necesario para encontrar la clave es siempre el MISMO!! Pero eso no es todo: el juego tiene mas otro check para saber se el pokemon es legal o no. En esa tabla que yo vos presenté está presente un ítem llamado "CheckSum" (de lo ingles 'CheckSumatory', la función necesaria para el juego comparar los datos y su integridad) Ahora vos debéis estar preguntándo lo que hace esa tal suma o checksum? ¿:. Muy simples: hay un checksum en los primeros 32 bytes para ver se los otros 48 bytes estan legales, porque como a lo cierto ya lo repararan, esos datos son los datos mas importantes de los pokemons. Lo juego compara los dos checksums y si no son iguales, el pokemon vira BAD EGG! Pero antes de hacer lo que quier que sea, primero vamos a estudiar las partes encriptadas de los bytes. [IMG]http://img109.imageshack.us/img109/8910/partypokemontable2.png[/IMG] Pequeña nota: Si repararan, solo están ali 40 bytes, eso es porque es usado el comando XOR (en asm eor) que puede diminuir el numero de bytes y voltar a poner-lo bien! Es ese el principio de los patchs IPS, ellos XORan la rom Original con la modificada, y solo los bytes alterados permanecen! Surge un problema porque eses datos no están siempre en el mismo hogar, que es definido por la personalidad, el primer valor de los datos que no están encriptados. Entonces torna extremamente difícil cambiar los datos. Pero por un sistema de checks, podemos hacer con que los datos sean almacenados por la misma orden en el offset de ram libre + 0x18. Eso va a tornar la rutina gigantesca, pero solo voy a presentar el codigo hex, para no ocupar la pagina web toda. Entonce nos queda hacer una rutina que haga lo siguiente: [list=1] [*]Encuentre a clave de encriptacion y la guarde en un offset de RAM libre. [*]Almacenar el CheckSum en el offset de RAM libre + 0x6 [*]Decryptar y copiar los datos de lo pokemon seleccionado en el offset de RAM libre+ 0x18) [*]A partir de ese offset libre, almacene los datos en esta orden: tamaño = offset +0x08; attack = offset + 0x0c; effort = offset +0x10; misc. = offset + 0x14 [/list] Dado eso, los datos pueden ser cambiados con WTBO, siguiendo la imagen de la tablas ali arriba. ---------------------EDIT---------------------- La rutina no esta user-friendly, me perdonen, pero como vosotros sabéis, esos datos encriptados cambian de posición en la RAM dependiendo del Personality Value. Yo he dado unas vueltas con la rutina para que ella pueda leer donde estan y poner los offsets de los datos por la siguiente orden: Growth(Tamaño)-Attack-Effort-Misc. Dado eso tendrán que acceder a los datos usando ASM. Pero como una buena parte de vosotros no lo sabe, yo voy a postar acá las rotinas en HEX, despues de tener todo hecho. Por ahora quedan las rutinas de encriptamiento/desencriptamiento. Entonces les voy a explicar algunas cosas: Esa rutina desencripta los datos en la RAM, en un offset libre. Para ese efecto, he elegido 0203F400. Para elegir el pokemon que quieren desencriptar, tendrán que elegir el slot de la party (0x0->1;0x1->2;0x2->3;0x3->4;0x4->5;0x5->6) e poner-lo en la var 8004. Porque esa VAR? Porque el Special 0x9F hace lo mismo. Vosotros eligen un pokemon y eso special pone el numero de la posicion del en la party (esto es muy bueno si queréis, por ejemplo, hacer una EV SHOP o un evento relacionado). La rutina de desencriptamiento es esta (en HEX):[spoiler=Pulsa para desplegar este spoiler]FF B5 04 4D 2D 88 04 4C 64 26 04 4F 75 43 64 19 06 E0 00 00 CC E8 02 02 60 43 00 03 00 F4 03 02 20 68 01 B4 61 68 41 40 39 60 A1 8B F9 80 20 22 10 19 18 22 D1 19 0C 22 3D 68 03 68 6B 40 0B 60 04 31 04 30 01 3A 00 2A F7 D1 01 BC 18 21 C0 22 12 06 82 42 00 D8 80 1A 52 08 82 42 01 D2 80 1A 00 00 06 DF 08 1C 06 21 06 DF 00 28 01 D1 18 22 0A E0 01 29 01 DC 24 22 06 E0 01 22 0A 40 01 2A 01 D0 30 22 00 E0 3C 22 BA 18 BA 60 03 28 01 D1 18 22 0A E0 04 29 01 DB 24 22 06 E0 01 22 0A 40 01 2A 01 D1 30 22 00 E0 3C 22 BA 18 7A 61 01 28 03 DC 00 28 0F D0 18 22 18 E0 02 23 07 D0 03 29 05 D0 00 29 05 D0 05 29 03 D0 3C 22 0E E0 24 22 0C E0 30 22 0A E0 01 29 01 DC 24 22 06 E0 01 22 0A 40 02 2A 01 D1 30 22 00 E0 3C 22 BA 18 FA 60 02 28 03 DB 02 28 0F DC 18 22 18 E0 02 29 07 D0 03 29 05 D0 00 29 05 D0 05 29 03 D0 3C 22 0E E0 24 22 0C E0 30 22 0A E0 05 29 01 DB 24 22 06 E0 01 22 0A 40 00 2A 01 D0 30 22 00 E0 3C 22 BA 18 3A 61 FF BD[/SPOILER] Tendrán que la poner en un offset que termine en 0,4,8 o C. Tiene que ser pues hay comandos ali que son de 4 bytes (el BL), Y si no están alignados correctamente, no trabajaran correctamente. La rutina de encriptamiento es cuasi el mismo, solo que al revés. No es tan gigantesca porque no tiene que saber onde poner la data ni el que haya sido cambiado. Primero arregla el checksum e después encripta los datos. Hay que ser llamada después de cualquier modificación hecha. [spoiler=Pulsa para desplegar este spoiler]FF B5 04 4D 2D 88 04 4C 64 26 04 4F 75 43 64 19 06 E0 00 00 CC E8 02 02 60 43 00 03 00 F4 03 02 1C 22 A0 18 18 22 B9 18 00 25 0B 88 5D 19 02 31 01 3A 00 2A F9 D8 2D 04 2D 0C 05 80 30 39 04 30 0C 22 3D 68 0B 68 6B 40 03 60 04 30 04 31 01 3A 00 2A F7 D8 FF BD [/SPOILER] Tendrán que la poner en un offset que termine en 0,4,8 o C Creditos a JPAN (un otro hacker, también de Portugal, pero no esta aquí) por el Checksum Fix/Rutinas. Primer me pareció bien usar mí rutina, pero JPAN me aconsejó a usar sus rutinas, para tener compatibilidad con sus códigos. Entonces, me pus a lo trabajo de convertir sus códigos de FR para R/S. El resultado: esas dos rutinas, trabajando para R/S Ahora es todo. Mas tarde me voy a poner como lo acceder a los datos. Saludos![hr]Las próximas rutinas fueran hechas por JPAN. Entonces tenéis que dar creditos a el, no a mi. Yo solo las adapte a Ruby. Ya saben: Party slot en la variable 0x8004 (para correcto desencriptamiento & encriptamiento) Cosas especiales en las variables 8005 arriba. Si quieren elegir el pokemon sin el setvar 0x8004 0xPartySlot entonces pueden recorrer al special 0x9F, que pone el party slot del pokemon han elegido en la variable 0x8004. La mayoría de estas rutinas usa usa las variables 0x8005 arriba como input o entonces como output.Eso significa que unas veces tienes que poner un valor en 8005 y otras es la variable que te da el valor que quieres (Ej: Viendo la pokebola de un pokemon ). ---------------------- Viendo la pokebola de un pokemon! Útil para scripts en que solo te dejan entrar teniendo un pokemon (o entonces toda la party) en una pokebola especial, o entonces un sitio que libertes los pokemons pero guardes la bola. Var_8004- Party Slot Var_8005 es donde va a ser guardado el numero hex de la bola. 03 b5 03 48 00 68 03 49 c0 78 c0 08 08 80 03 bd 14 f4 03 02 CE E8 02 02 Ejemplo de Script [spoiler=Pulsa para desplegar este spoiler] #org @test setvar 0x8004 0x0 'Primer pokemon de nuestra equipe callasm 0x800501 'Rutina de desencriptamiento callasm 0x800000 'Rutina de Pokebola callasm 0x801001 'Rutina de encriptamiento compare 0x8005 0x1 if 0x1 goto @master compare 0x8005 0x2 if 0x1 goto @ultra compare 0x8005 0x3 if 0x1 goto @great compare 0x8005 0x4 if 0x1 goto @poke release end #org @master msgbox @master_1 0x2 end #org @ultra msgbox @ultra_1 0x2 end #org @great msgbox @great_1 0x2 end #org @poke msgbox @poke_1 0x2 end #org @master_1 = Master Ball! #org @ultra_1 = Ultra Ball! #org @great_1 = Great ball! #org @poke_1 = Poke Ball! [/SPOILER] --- Identificar una especie pokemon Si, es verdad que ya hay una combinación de comandos que hace eso, pero esta rutina funciona también con huevos. Es util para trade events, o entonces para eventos como la activación de los 3 REGIs, con relicanth en 1er lugar y wailord en 6to de la party. 03 b5 03 48 00 68 03 49 00 88 08 80 03 db 00 00 08 f4 03 02 ce e8 02 02 Ejemplo de script:[spoiler=Pulsa para desplegar este spoiler] '--------------- #org 0x800012 setvar 0x8004 0x0 'primer slot de la party callasm 0x800501 ' Rutina de desencriptamiento callasm 0x8006C1 ' Rutina de Identificación Pokemon callasm 0x801001 ' Rutina de encriptamiento bufferpokemon 0x0 0x8005 msgbox 0x8800026 MSG_NORMAL '"!" release end '--------- ' Strings '--------- #org 0x800026 = ! [/SPOILER] --- Aumentando la felicidad de un Pokemon por cualquier valor (hasta 0xFF)! Esto es util para una Happiness shop, o entonces un evento en que un pokemon no te gusta mismo nada pero tu le salvas la vida y el desde eso se pone a gustar de ti mucho. 0f b5 08 48 00 68 08 49 0b 88 42 7a 9a 18 ff 2a 01 dc 62 72 0f bd ff 23 d3 1a ff 22 42 72 0b 80 0f bd 00 00 08 f4 03 02 CE E8 02 02 En este caso especifico tienen que hacer 'setvar 0x8005 0xValorDeFelicidad' y solo después deben hacer callasm. Ejemplo de script: [spoiler=Pulsa para desplegar este spoiler] #org @felicidad setvar 0x8004 0x0 'Primer slot de la party setvar 0x8005 0x7F 'Un valor de felicidad cualquier a darle. El máximo que un pokemon puede tener es 0xFF Callasm 0x800501 ' Rutina de desencriptamiento callasm 0x800131 ' Rutina de Felicidad callasm 0x801001 ' Rutina de Encriptamiento release end [/SPOILER] ------- Apagando todos los EV's A veces, en los filmes, hay magos que absorben poderes. Esto es bueno para un evento así, en que un mago retira todas las fuerzas a un pokemon tuyo. 03 B5 03 48 00 68 00 21 01 60 81 80 03 BD 00 00 10 F4 03 02 Ejemplo de script: [spoiler=Pulsa para desplegar este spoiler] #org @apagar_EVs setvar 0x8004 0x0 'Primer slot de la party Callasm 0x800501 ' Rutina de desencriptamiento callasm 0x800161 ' Rutina de Apagar EV's callasm 0x801001 ' Rutina de Encriptamiento release end [/Spoiler] Por ahora es todo. Mas tarde traeré unas cuantas mas rutinas. Creditos a JPAN. Saludos ~Sonicarvalho Aka D.Ray